package com.xiaoda.dao;

import com.xiaoda.entity.Article;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Repository
public interface ArticleDao {

    /**
     * 查询所有文章
     *
     * @return 文章列表
     */
    List<Article> findAll();

    /**
     * 根据 id 查询文章，对象不完整
     *
     * @param id 文章 id
     * @return 文章
     */
    Article findById(int id);

    /**
     * 根据 id 查询文章，对象完整
     *
     * @param id 文章 id
     * @return 文章
     */
    Article findFullById(int id);

    /**
     * 根据关键字查询文章
     *
     * @param keyword 关键字
     * @param start   起始位置
     * @param end     结束位置
     * @return 文章列表
     */
    List<Article> findByKeyword(@Param("keyword") String keyword, @Param("start") int start, @Param("end") int end);

    /**
     * 查询关注的人的文章
     *
     * @param uid   用户 id
     * @param start 起始位置
     * @param end   结束位置
     * @return 文章列表
     */
    List<Article> findConcern(@Param("uid") String uid, @Param("start") int start, @Param("end") int end);

    /**
     * 查询浏览量大于 300 的文章
     *
     * @param start 起始位置
     * @param end   结束位置
     * @return 文章列表
     */
    List<Article> findMoreThan(@Param("start") int start, @Param("end") int end);

    /**
     * 查询浏览量小于等于 300 的文章
     *
     * @param start 起始位置
     * @param end   结束位置
     * @return 文章列表
     */
    List<Article> findLessThan(@Param("start") int start, @Param("end") int end);

    /**
     * 查询浏览量前 50 的文章
     *
     * @return 文章列表
     */
    List<Article> findTop50();

    /**
     * 根据用户 id 查询文章
     *
     * @param uid   用户 id
     * @param start 起始位置
     * @param end   结束位置
     * @return 文章列表
     */
    List<Article> findAllByUid(@Param("uid") String uid, @Param("start") int start, @Param("end") int end);

    /**
     * 查询所有收藏的文章
     *
     * @param account 用户账号
     * @param start   起始位置
     * @param end     结束位置
     * @return 文章列表
     */
    List<Article> findAllTreasured(@Param("account") String account, @Param("start") int start, @Param("end") int end);

    /**
     * 查询所有点赞的文章
     *
     * @param account 用户账号
     * @param start   起始位置
     * @param end     结束位置
     * @return 文章列表
     */
    List<Article> findAllHobbies(@Param("account") String account, @Param("start") int start, @Param("end") int end);

    /**
     * 计算所有发布的文章数量
     *
     * @param account 用户账号
     * @return 文章数量
     */
    int countArticleNum(String account);

    /**
     * 根据用户 id 和 文章 id 查询其余发布的文章
     *
     * @param account 用户账号
     * @param aid     文章 id
     * @return 文章列表
     */
    List<Article> findOtherArticles(@Param("account") String account, @Param("aid") int aid);

    /**
     * 修改文章浏览量
     *
     * @param id 文章 id
     * @return 修改结果
     */
    int hasLook(int id);

    /**
     * 添加文章
     *
     * @param title   文章标题
     * @param content 文章内容
     * @param account 用户账号
     * @return 添加结果
     */
    int addArticle(@Param("title") String title, @Param("content") String content, @Param("account") String account);

    /**
     * 删除文章
     *
     * @param uid 用户 id
     * @return 删除结果
     */
    int deleteByUid(String uid);

    /**
     * 根据条件查询文章
     *
     * @param map 查询条件
     * @return 文章列表
     */
    List<Article> searchArticles(Map<String, Object> map);

    /**
     * 删除文章
     *
     * @param id 文章 id
     * @return 删除结果
     */
    int deleteById(int id);

    /**
     * 修改文章
     *
     * @param article 文章实体
     * @return 修改结果
     */
    int updateArticle(Map<String, Object> article);

    /**
     * 添加文章
     *
     * @param map 文章信息
     * @return 添加结果
     */
    int insertArticle(Map<String, Object> map);

}
